/*
 * LeerYGrabarSector.c
 *
 *  Created on: 26/09/2011
 *      Author: root
 */

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>  /* para la funcion map */
#include <unistd.h>  /* para close */
#include <features.h>
#include <sys/types.h>
#include <sys/stat.h>    /* para la funcion fstat y la estructura struct stat */
#include <fcntl.h>       /* para open */
#include <string.h>
#include <stdint.h>
#include "./includes/LeerYGrabarSector.h"
#include "./includes/variablesGlobales.h"

t_operaciones *operaciones_inicializar( char* filePath){
	int32_t posix;
	t_operaciones* operaciones=calloc(1,sizeof(t_operaciones));
	struct stat bstat;
	if((operaciones->descriptorArchivo = open( filePath, O_RDWR )) == -1){
			fprintf(stderr,"No se pudo abrir el archivo \n");
	}

	if(fstat(operaciones->descriptorArchivo,&bstat) == -1){
			fprintf(stderr,"No se pudo obtener los atributos del archivo");
			close(operaciones->descriptorArchivo);
	}

	operaciones->tamArchivo = bstat.st_size;

	if( (operaciones->mapeado=mmap( (caddr_t)0, operaciones->tamArchivo, PROT_READ|PROT_WRITE, MAP_SHARED,operaciones->descriptorArchivo, (off_t)0)) == MAP_FAILED ){
			fprintf(stderr,"No se pudo mapear el archivo en memoria");
	}
	posix = posix_madvise(operaciones->mapeado,operaciones->tamArchivo,MADV_SEQUENTIAL);
	if(posix == -1){
		perror("posix");
	};
	return operaciones;
}

void cerrar_operaciones(t_operaciones *operaciones){

	if((munmap(operaciones->mapeado,operaciones->tamArchivo)) == -1){
			fprintf(stderr,"No se pudo cerrar el archivo mapeado");
	}

	if(close(operaciones->descriptorArchivo) == -1){
			fprintf(stderr,"No se pudo cerrar el archivo");
	}

}

sector_t leerSector2 (const int sectorLogico,t_operaciones *operaciones){
	int	sectorFisico,
	siguienteSector;
	sector_t buffer;

	sectorFisico = sectorLogico * 512;
	siguienteSector = sectorFisico + 512;

	memcpy(buffer.datos,(operaciones->mapeado) + sectorFisico,BytesxSector);
	if(contRafaga == 10000){
	contRafaga = 0;
	printf("lee desde el byte %d hasta el %d\n",sectorFisico+1,siguienteSector);
};
	buffer.idSector=sectorLogico;

	contRafaga++;
	return buffer;
}

void grabarSector (t_operaciones *operaciones,const int32_t sectorLogico, sector_t *buffer){
	int sectorFisico,siguienteSector;

	sectorFisico = sectorLogico * 512;
	siguienteSector = sectorFisico + 512;

	memcpy((operaciones->mapeado)+sectorFisico,(*buffer).datos,BytesxSector);

	//printf("graba desde el byte %d hasta el %d \n",sectorFisico+1,siguienteSector);

	(*buffer).idSector=sectorLogico;

	return;
}